package model.siec.definicja;

import model.liczba.ILiczba;
import model.liczba.IObslugaLiczba;


public class CFunkacjaAktywacjaSigmoidalna implements IFunkcjaAktywacja {

	private ILiczba beta;
	
	public CFunkacjaAktywacjaSigmoidalna(ILiczba beta) {
		this.beta = beta;
	}

	/*
	 * (non-Javadoc)
	 * @see model.siec.IFunkcjaAktywacja#getFunkcjaWartosc(model.CLiczba)
	 */
	public ILiczba getFunkcjaWartosc(IObslugaLiczba liczbaObsluga, ILiczba argument) {
		ILiczba potega = liczbaObsluga.multiply(argument, beta);
		double wynikPotegi = 
				Math.pow(Math.E, - potega.doubleValue());
		
		ILiczba mianownik = liczbaObsluga.add(liczbaObsluga.getJEDEN(), liczbaObsluga.create(wynikPotegi));
		ILiczba wynik = liczbaObsluga.getJEDEN();
			
		wynik = liczbaObsluga.divide(wynik, mianownik);
		return wynik;
	}

	/*
	 * (non-Javadoc)
	 * @see model.siec.IFunkcjaAktywacja#getFunkcjaPochodnaWartosc(model.CLiczba)
	 */
	public ILiczba getFunkcjaPochodnaWartosc(IObslugaLiczba liczbaObsluga, ILiczba argument) {
		ILiczba wartoscFunkcji = getFunkcjaWartosc(liczbaObsluga, argument);
		ILiczba roznica = liczbaObsluga.subtract(liczbaObsluga.getJEDEN(), wartoscFunkcji);
		ILiczba iloczyn = liczbaObsluga.multiply(wartoscFunkcji, roznica);
		ILiczba wynik	= liczbaObsluga.multiply(beta, iloczyn);
				
		return wynik;
	}

}
